From e723fd6a238d52f9c458e8d442f2327644ab5016 Mon Sep 17 00:00:00 2001 From: Daniel Boles Date: Thu, 1 Dec 2016 12:38:43 +0000 Subject: [PATCH] ComboBox: Do not select item before menu realised For a menu mode CB with wrap_width == 0 and an active item, that item is selected in gtk_combo_box_menu_popup. Selection causes the MenuShell to activate and hence take a grab. This was done before the menu was popped up. A patch distributed in Debian sid - after being proposed on our BZ - revealed that on the 1st popup of any such ComboBox, within grab_add, the MenuShell's toplevel's GdkWindow is NULL. This causes a Gdk-CRITICAL assertion fail on the 1st time opening any such CB, on Debian and if that patch were merged to GTK+. By selecting after popup, we ensure the MenuShell is realised before its grab_add and so avoid the critical. https://bugzilla.gnome.org/show_bug.cgi?id=771242 --- gtk/gtkcombobox.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c index cc0bfa61f8..3dff9f810f 100644 --- a/gtk/gtkcombobox.c +++ b/gtk/gtkcombobox.c @@ -1702,6 +1702,7 @@ gtk_combo_box_menu_popup (GtkComboBox *combo_box, gint rect_anchor_dy = -2; gint child_height; GtkWidget *active; + GtkWidget *select; GtkWidget *child; GList *i; @@ -1761,10 +1762,9 @@ gtk_combo_box_menu_popup (GtkComboBox *combo_box, { /* FIXME handle nested menus better */ active = gtk_menu_get_active (GTK_MENU (priv->popup_widget)); + select = active; - if (active) - gtk_menu_shell_select_item (GTK_MENU_SHELL (priv->popup_widget), active); - else + if (!active) { for (i = GTK_MENU_SHELL (priv->popup_widget)->priv->children; i && !active; i = i->next) { @@ -1808,6 +1808,9 @@ gtk_combo_box_menu_popup (GtkComboBox *combo_box, GDK_GRAVITY_WEST, GDK_GRAVITY_NORTH_WEST, trigger_event); + + if (select) + gtk_menu_shell_select_item (GTK_MENU_SHELL (priv->popup_widget), select); } } -- 2.30.2